import { Message } from 'element-ui'
import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { getTimeStamp } from '@/utils/auth'

// 定义token超时时间
const TimeOut = 3600

const service = axios.create({
    baseURL: process.env.VUE_APP_BASE_API,
    timeout: 5000 // 定义5秒超时
})

service.interceptors.request.use(
    config => {
        // 判断是否存在token, 如果有就注入token
        if (store.getters.token) {
            // 判断token是否过期
            if (isTimeOut()) {
                store.dispatch('user/logOut')
                router.push('/login')
                return Promise.reject('token超时, 请重新登录')
            } else {
                config.headers['Authorization'] = `Bearer ${store.getters.token}`
            }
        }
        return config
    },
    error => {
        return Promise.reject(error)
    })

// 响应拦截器
service.interceptors.response.use(
    (response) => {
        // axios默认加了一层data
        const { success, message, data } = response.data
        //   要根据success的成功与否决定下面的操作
        if (success) {
            return data //直接返回data，不像之前那样给数据包裹了一层 ***
        } else {
            // 业务已经错误了 还能进then ? 不能 ！ 应该进catch
            Message({ type: 'error', message: message || '出错了请稍后再试' })  // 提示错误消息
            return Promise.reject(new Error(message))
        }
    },
    (error) => {
        // 判断服务器返回是否失效token // 如果返回的code === 10002 代表token已经失效
        if (error.response && error.response.data && error.response.data.coode === 10002) {
            store.dispatch('user/logOut') // 退出登录操作
            router.push('/login') // 并跳转到login页
        } else {
            Message({ type: 'error', message: error || '出错了请稍后再试' })  // 提示错误信息
        }
        return Promise.reject(error) // 并统一返回 失败的Promise
    })

function isTimeOut() {
    // 缓存时间戳
    let getTime = getTimeStamp();
    // 当前时间戳
    let nowTime = Date.now();
    return (nowTime - getTime) / 1000 > TimeOut
}

export default service